home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 1
/
Gekikoh Dennoh Club Vol. 1 (Japan).7z
/
Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin
/
tools
/
pcd2
/
src
/
pcd2.has
< prev
next >
Wrap
Text File
|
1997-03-23
|
17KB
|
820 lines
*************************************************
* 作るつもりはなかったけど
* 電脳倶楽部CDに載ったので続編
* PCD(通).x
* 著作権は可能な限り放棄します
* 改造等は、貴方の良心に従って下さい
* 実行形式・ソース共、利用に制限はありませんが
* 無保証であることだけは保証します
* by Fa.Tom 1996
*************************************************
*------------------------------
* インクルード&外部参照
*------------------------------
.include doscall.mac
.include iocscall.mac
.include const.h
.xref Make_Table
.xref GetFHdl
.xref ChkPCD
.xref GetFHdl_Break
.xref YCC2XHI_S,YCC2XHI_X
.xref PCD_MAIN
.xref Seek_PCD,TC1
.xref BASEDATA_X
.xref BASEDATA_S
.xref PF_PLAY,GA_INIT,GA_DISP
.xref K_Clear
.xdef IMAGE_NUM,V_FLAME,FLG_WP
.xdef DEC_WORK
.xdef SW_S,SW_Q,SW_K,SW_PF,Graph_Ptr,FLG_V,SW_P
.xdef SW_LX,SW_LY,VCR2
*------------------------------
* プログラム部
*------------------------------
.cpu 68000
.text
.align 4
* .dc.b 'PCD2 Fa.Tom-1996'
*------------------------------
* 初期化部(というほどではない)
*------------------------------
ProStart:
move.l #-1,V_FLAME
lea.l (StackBtm),sp
lea.l (16,a0),a0
sub.l a0,a1
pea (a1)
pea (a0)
DOS _SETBLOCK
addq.l #8,sp
lea.l (a0,$b4),a0 * 実行ファイル名は変更を前提としております
move.l a0,(ExecFN) * PCD(通).xのまま使うバカはいないでしょうが
tst.b (a2)+
beq NoCMD
bsr ChkCMD * コマンドラインの解析ルーチンへ
lea.l (Print_Job),a6 * -Qによってメッセージ出力ルーチンを
tst.b (SW_Q) * 選択
beq @f
lea.l (NoPrint_Job),a6 * 中身は'rts'だけ
@@:
suba.l a1,a1
IOCS _B_SUPER
move.l d0,a1
move.w ($e82600),(VCR2)
IOCS _B_SUPER
move.l (ExecFN),a1 * やっとファーストメッセージの表示
jsr (a6)
lea.l (title_txt),a1
jsr (a6)
tst.b (SW_H)
beq @f
move.l (ExecFN),a1
jsr (a6)
lea.l (Help_txt),a1
jsr (a6)
bra Pro_Exit
@@:
IOCS _MS_INIT
tst.b (SW_FN) * ファイル指定はあるか?
bne @f
lea.l (NoFile_Txt),a1
jsr (a6)
st (SW_E) * ファイル指定の有無をコマンドラインエラーに反映
@@:
tst.b (SW_BE)
beq @f
lea.l (BrightErr_Txt),a1
jsr (a6)
@@:
tst.b (SW_G)
bne @f
bsr GA_INIT *TS-6BGAとAGIOCSのチェック及び初期化 [pcd_ga.has]
move.l d0,V_FLAME
tst.l d0
bmi @f
clr.b (SW_S)
bra 1f
@@:
tst.b (SW_F) * GVRAMが使用されているかチェック
bne @f * -Fが影響する
moveq.l #0,d1
moveq.l #-1,d2
IOCS _TGUSEMD
cmpi.w #1,d0 * システムで使用中か?
bne @f
lea.l (GVRAM_SYSTEM_USE_txt),a1
jsr (a6)
st (SW_E)
bra 1f
@@:
cmpi.w #2,d0 * アプリケーションで使用中か?
bne 1f
lea.l (GVRAM_APRI_USE_txt),a1
jsr (a6)
st (SW_E)
1:
move.w #-1,-(sp) *
move.w #$e,-(sp) * 現在のファンクションモードを検出
DOS _CONCTRL *
addq.l #4,sp *
move.w d0,(FuncMODE)
moveq.l #-1,d0 * コマンドラインエラーが発覚していたら終了
tst.b (SW_E)
bne Pro_Exit2
tst.l V_FLAME
beq @f
tst.b (SW_Q)
bne @f
move.l #-1,d1
IOCS _B_LOCATE
move.l d0,d7
move.w #$0003,-(a7) *
move.w #$000e,-(a7) * ファンクション表示を消す
DOS _CONCTRL *
addq.l #4,a7 *
move.w d7,d2
swap d7
move.w d7,d1
IOCS _B_LOCATE
@@:
lea.l (Target_File),a0
bsr GetFHdl * ファイルネームをオープン [wild.has]
tst.l d0
bpl 9f
EXT_PLUS: * "*"という指定に対応
tst.b (a0)+
bne EXT_PLUS
cmpi.b #'.',(-2,a0) * "filename."という指定に対応
bne @f
subq.l #1,a0
@@: move.b #'.',(-1,a0)
move.b #'P',(a0)+
move.b #'C',(a0)+
move.b #'D',(a0)+
clr.b (a0)
lea.l (Target_File),a0
bsr GetFHdl * ファイルネーム+[.PCD]をオープン [wild.has]
tst.l d0
bmi NotFoundFile_err
st (FLG_EXT)
9:
move.w d0,FHdl
move.w (DEF_Y),d0 * 明るさ指定
bsr Make_Table * フォトYCCデコード用のテーブルを作る [pcddec.has]
tst.b (SW_A)
bne Load_Memory
4: move.w FHdl,d0
bsr PF_PLAY *Portfolio再生 [pcd_pf.has]
tst.l d0
beq 5f *再生出来た
bmi 3f *処理の中断が指示された
move.w FHdl,d0
bsr PCD_MAIN * 表示担当のモジュールへ [pcd_main.has]
bsr K_Clear
5: tst.l d0
bgt 2f * 表示出来なかった
bmi 3f * 処理の中断が指示された
1: st (FLG_V) * 一枚でも表示出来たらフラグを立てる
2: move.w FHdl,d0
bsr GetFHdl * 次のファイルを得る [wild.has]
tst.l d0
bmi Files_End
move.w d0,FHdl
bra 4b
3:
lea.l (LocateErr_txt),a1
cmpi.w #-2,d0
beq @f
lea.l (MemoryErr_txt),a1
cmpi.w #-3,d0
beq @f
lea.l (ESC_key_txt),a1
cmpi.w #-4,d0
beq @f
lea.l (File_Break_txt),a1
cmpi.w #-5,d0
beq @f
lea.l (Playlist_NOread_txt),a1
cmpi.w #-6,d0
beq @f
lea.l (NotFile_txt),a1
@@:
jsr (a6)
st (FLG_V)
move.w FHdl,d0
bsr GetFHdl_Break * 元PATHへ戻す [wild.has]
lea.l (Break_txt),a1
jsr (a6)
Files_End:
tst.b (FLG_V)
bne 1f
tst.b (FLG_EXT)
beq EXT_PLUS * "*"という指定だと、*.PCDを見落とすので戻る
lea.l (PCD_NotFound_txt),a1
jsr (a6)
1:
suba.l a1,a1
IOCS _B_SUPER
move.l d0,a1
move.w (VCR2),($E82600)
2: tst.l V_FLAME
beq @f
tst.b (SW_Q)
bne @f
move.l #-1,d1
IOCS _B_LOCATE
move.l d0,d7
move.w (FuncMODE),-(sp)
move.w #$000e,-(a7) * システムラインを元のモードに戻す
DOS _CONCTRL *
addq.l #4,a7 *
move.w d7,d2
swap d7
move.w d7,d1
IOCS _B_LOCATE
@@:
tst.b (SW_S)
beq @f
tst.b (SW_Q)
bne @f
moveq.l #-1,d1
IOCS _SKEY_MOD
move.w (TC1),($e82202)
@@: IOCS _B_SUPER
IOCS _OS_CURON
*------------------------------
* 正常終了
*------------------------------
Pro_Exit:
tst.l V_FLAME
bne @f
moveq.l #0,d0
bsr GA_DISP
@@: bsr K_Clear
DOS _EXIT
*------------------------------
* 異常終了
*------------------------------
Pro_Exit2:
move.w d0,-(sp)
tst.l V_FLAME
bne @f
moveq.l #0,d0
bsr GA_DISP
bra 1f
@@: move.l #-1,d1
IOCS _B_LOCATE
move.l d0,d7
move.w (FuncMODE),-(sp)
move.w #$000e,-(a7) * システムラインを元のモードに戻す
DOS _CONCTRL *
addq.l #4,a7 *
cmpi.w #3,FuncMODE
beq @f
cmpi.w #31,d7
bcs @f
move.w #30,d7
@@: move.w d7,d2
swap d7
move.w d7,d1
IOCS _B_LOCATE
1: bsr K_Clear
IOCS _OS_CURON
DOS _EXIT2
*------------------------------
* メモリに展開
*------------------------------
Load_Memory:
move.w FHdl,d0
bsr ChkPCD * ファイルフォーマットを調査 [chkpcd.has]
tst.w d0
bmi Pro_Exit2 * d0.w<0の時、イメージパックデータではない
move.w (IMAGE_NUM),d1 * 指定データが存在するかチェック
btst.l d1,d0 * フォトCDカタログで保証されているのは1/16BASEのみ
beq LM_exit3
move.w FHdl,d0
bsr Seek_PCD * 画像データ位置までSEEK [chkpcd.has]
lea.l (DEC_WORK),a1
add.w d1,d1
clr.l -(sp)
DOS _SUPER
move.l d0,(sp)
tst.b (SW_S)
bne Square_Mode
lea.l (BASEDATA_X),a0
add.w (a0,d1.w),a0
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
move.w (-8,a1),d1
addq.l #1,d1
add.w d1,d1 1/3
add.w d1,d1 2/3
move.w (SW_W),d0
bne @f
move.w IMAGE_NUM,d0
add.w d0,d0
move.w (1f,pc,d0.w),d0
@@: cmp.w d1,d0
bmi LM_exit3 * 展開先に充分な幅がない
move.w d0,(a1)+
add.w d0,d0
move.w d0,(a1)+
lea.l (DEC_WORK),a1
move.l (Graph_Ptr),a0
move.w (FHdl),d0
bsr YCC2XHI_X * 画像を展開する [pcddec.has]
bra LM_1
.align 4
1: .dc.w 128*2,256*2,512*2 * ,1024*2,2048*2
2: .dc.w 192*2,384*2,768*2 * ,1536*2,3072*2(そもそもメモリが足りない)
Square_Mode:
lea.l (BASEDATA_S),a0
add.w (a0,d1.w),a0
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
move.w (SW_W),d0
bne @f
move.w IMAGE_NUM,d0
add.w d0,d0
move.w (2b,pc,d0.w),d0
@@: cmp.w (-2,a1),d0
ble LM_exit3 * 展開先に充分な幅がない
move.w d0,(a1)+
add.w d0,d0
move.w d0,(a1)+
lea.l (DEC_WORK),a1
move.l (Graph_Ptr),a0
move.w (FHdl),d0
bsr YCC2XHI_S * 画像を展開する [pcddec.has]
LM_1: tst.l d0
bmi LM_exit3
move.w (FHdl),d0
bsr GetFHdl_Break * パスを元に戻す [wild.has]
moveq.l #0,d0
DOS _SUPER
addq.l #4,sp
bra Pro_Exit
.align 4
LM_exit3:
move.w (FHdl),d0
bsr GetFHdl_Break * パスを元に戻す [wild.has]
DOS _SUPER
addq.l #4,sp
moveq.l #-1,d0
bra Pro_Exit2
*------------------------------
* メッセージ表示(SW_Qで影響)
*------------------------------
Print_Job:
IOCS _B_PRINT
NoPrint_Job:
rts
*------------------------------
* 指定ファイルはない
*------------------------------
NotFoundFile_err:
lea.l (NoFFile_Txt),a1
jsr (a6)
bra Pro_Exit2
*------------------------------
* コマンドライン無し
*------------------------------
NoCMD:
move.l (ExecFN),-(sp)
DOS _PRINT
pea (title_txt)
DOS _PRINT
pea (Help_txt)
DOS _PRINT
pea (NoFile_Txt)
DOS _PRINT
lea.l (16,sp),sp
bra Pro_Exit2
*------------------------------
* コマンドライン解釈部(頭がウニウニ)
*------------------------------
ChkCMD:
move.b (a2)+,d0
beq ChkCMD_Exit
cmpi.b #SPACE,d0
beq ChkCMD
cmpi.b #TAB,d0 * でも僕はタブコードでコマンドラインを区切ったことは
beq ChkCMD * ありません(除く:makefile)
cmpi.b #'-',d0 * '-'で始まるファイル名は作れますが
beq ChkCMD_SW * 作らないように(command.xの内部コマンドが対応出来ない)
cmpi.b #'/',d0 * '/'でパスを区切っている人は、
beq ChkCMD_SW * 相対指定するか、ドライブ名をつけましょう
st (SW_FN) * ファイルネーム取り込み処理
lea.l (Target_File),a0
@@: move.b d0,(a0)+
move.b (a2)+,d0
beq ChkCMD_FCopy_Exit
cmpi.b #SPACE,d0
beq ChkCMD_FCopy_Break
cmpi.b #TAB,d0
beq ChkCMD_FCopy_Break
bra @b
ChkCMD_FCopy_Break:
clr.b (a0)
bra ChkCMD
ChkCMD_FCopy_Exit:
clr.b (a0)
bra ChkCMD_Exit
ChkCMD_Exit2: * コマンドラインエラーが発見された時
st (SW_E) * '-'で終わっていた時とか
ChkCMD_Exit:
rts * 初期化部に戻る
ChkCMD_Continue:
st (SW_E) * コマンドラインエラーが発見されたけど
bra ChkCMD * コマンドラインが続いた場合(-Q指定を探す)
ChkCMD_SW:
clr.w d0
move.b (a2)+,d0
beq ChkCMD_Exit2
cmpi.b #'?',d0
beq ChkCMD_Help
cmpi.b #$40,d0
bmi ChkCMD_SW_01234 * かなり適当
andi.b #$5f,d0
cmpi.b #'A',d0
beq ChkCMD_Address * 展開アドレス指定
cmpi.b #'B',d0
beq ChkCMD_Bright * 明るさ調整
cmpi.b #'F',d0
beq ChkCMD_Fource * TGUSEMDの値を無視
cmpi.b #'Q',d0
beq ChkCMD_Quiet * 沈黙モード(一切のテキスト出力を行わない)
cmpi.b #'S',d0
beq ChkCMD_Square * 正方形モード設定
cmpi.b #'G',d0
beq ChkCMD_GVRAM * G-RAMへ表示
cmpi.b #'P',d0
beq ChkCMD_PLread * PLAYLIST.PCDを強制読み込み
cmpi.b #'L',d0
beq ChkCMD_Locate * 展開座標指定(アドレスモード時不可)
cmpi.b #'W',d0 * アドレスモード時に必ず指定すること
beq ChkCMD_Width * 展開バッファの横バイト数(十進)デフォルトは展開Xサイズ*2
cmpi.b #'K',d0
beq ChkCMD_Keysns * キー入力対応
cmpi.b #'H',d0
beq ChkCMD_Help * ヘルプメッセージ出力
rts
*------------------------------
* 展開アドレス指定モード
*------------------------------
ChkCMD_Address:
st (SW_A)
st (SW_Q)
bsr INTget
tst.l d0
bmi ChkCMD_Continue * 読み取りエラー
btst.l #0,d0
bne ChkCMD_Continue * 奇数アドレス指定エラー
move.l d0,(Graph_Ptr)
bra ChkCMD
*------------------------------
* アドレスモード時の1ラインバイト数
*------------------------------
ChkCMD_Width:
bsr INTget
tst.l d0
bmi ChkCMD_Continue
btst.l #0,d0
bne ChkCMD_Continue * 奇数バイト指定エラー
move.w d0,SW_W
@@: bra ChkCMD
*------------------------------
* 展開座標指定
*------------------------------
ChkCMD_Locate:
bsr INTget
tst.l d0
bmi ChkCMD_Continue
move.w d0,SW_LX
move.b (a2)+,d0
beq ChkCMD_Exit2
cmpi.b #',',d0
bne @f
bsr INTget
tst.l d0
bmi ChkCMD_Continue
move.w d0,SW_LY
@@: bra ChkCMD
*------------------------------
* 沈黙モード
*------------------------------
ChkCMD_Quiet:
st (SW_Q)
bra ChkCMD
*------------------------------
* 説明モード?
*------------------------------
ChkCMD_Help:
st (SW_H)
bra ChkCMD
*------------------------------
* キーセンスモード
*------------------------------
ChkCMD_Keysns:
st (SW_K)
bra ChkCMD
*------------------------------
* 正方形モード
*------------------------------
ChkCMD_Square:
st (SW_S)
bra ChkCMD
*------------------------------
* TS-6BGA未使用モード
*------------------------------
ChkCMD_GVRAM:
st (SW_G)
bra ChkCMD
*------------------------------
* PALYLIST_PCD強制読み込み
*------------------------------
ChkCMD_PLread:
st (SW_P)
bra ChkCMD
*------------------------------
* 強制GVRAM使用モード
*------------------------------
ChkCMD_Fource:
st (SW_F)
bra ChkCMD
*------------------------------
* 明るさ調整数値読取(0-200%)
*------------------------------
ChkCMD_Bright:
bsr INTget
tst.l d0
bmi @f
cmp.w #200,d0
bgt @f
move.w d0,(DEF_Y)
bra ChkCMD
@@:
st (SW_BE)
bra ChkCMD_Continue
*------------------------------
* 画像指定
*------------------------------
ChkCMD_SW_01234: * -0,-1,-2(,-3,-4)
sub.w #'0',d0
bmi ChkCMD_Exit2
cmpi.w #2,d0
* cmpi.w #4,d0 * 本当は4BASE,16BASEに対応したかった(ハフマン圧縮らしい)
bgt ChkCMD_Exit2 * コダックのシステムでは1024BASEまでではサポート出来るらしい・・・
move.w d0,IMAGE_NUM
bra ChkCMD
*------------------------------
* 数字読み取り
*------------------------------
INTget:
move.l d1,-(sp)
moveq.l #0,d0
moveq.l #-1,d1
move.w #0,d1
move.b (a2)+,d0
beq Str2Bin_e * 読み取るものがなかった。
cmpi.b #SPACE,d0
beq Str2Bin_e2
cmpi.b #TAB,d0
beq Str2Bin_e2
cmpi.b #'$',d0
beq Hex2Bin
cmpi.b #'0',d0
beq Hex?
NoHex:
subi.b #'0',d0
bmi Str2Bin_e
cmpi.b #9,d0
bgt Str2Bin_e
mulu.w #10,d1
add.l d0,d1
move.b (a2)+,d0
bne NoHex
Str2Bin_e:
subq.l #1,a2
Str2Bin_e2:
move.l d1,d0
movem.l (sp)+,d1
rts
Hex?:
moveq.l #0,d1
move.b (a2)+,d0
beq Str2Bin_e
cmpi.b #'x',d0
beq Hex2Bin_loop
cmpi.b #'X',d0
beq Hex2Bin_loop
move.b #'0',d0
subq.l #1,a2
bra NoHex
Hex2Bin:
moveq.l #0,d1
Hex2Bin_loop:
move.b (a2)+,d0
beq Str2Bin_e
cmpi.w #'0',d0
bmi Str2Bin_e
cmpi.w #'9',d0
ble Hex2Bin_Suji
cmpi.w #'A',d0
bmi Str2Bin_e
cmpi.w #'f',d0
bgt Str2Bin_e
cmpi.w #'F',d0
ble Hex2Bin_Hex
cmpi.w #'a',d0
bmi Str2Bin_e
Hex2Bin_Hex:
andi.b #$5f,d0
sub.w #'A'-10,d0
@@: lsl.l #4,d1
add.w d0,d1
bra Hex2Bin_loop
Hex2Bin_Suji:
sub.w #'0',d0
bra @b
*------------------------------
* データセクション
*------------------------------
.data
title_txt:
.dc.b ' ver1.24 by Fa.Tom,まる丸 1996/1997',$d,$a
.dc.b ' コダックPhotoCDフォーマットの画像を表示します。',$d,$a,0
Help_txt:
.dc.b ' -0 192*128を展開(128*128,-S時192*128)',$d,$a
.dc.b ' -1 384*256を展開(256*256,-S時384*256)',$d,$a
.dc.b ' -2 768*512を展開(512*512,-S時768*512)',$d,$a
.dc.b ' デフォルト画像は768*512(BASEサイズ)',$d,$a
.dc.b ' -S 正方形モード',$d,$a
.dc.b ' -Axxxxxx アドレスモード(メインメモリに展開・-Wも同時に指定して下さい)',$d,$a
.dc.b ' -Wnnn 1ラインのバイト数(アドレスモード時に影響)',$d,$a
.dc.b ' -Bnnn 明るさ調整(0-200%)',$d,$a
.dc.b ' -K キー待ち',$d,$a
.dc.b ' -Lx,y 画像展開位置',$d,$a
.dc.b ' -G TS-6BGAを使用しない',$d,$a
.dc.b ' -P PLAYLIST.PCD強制読み込み',$d,$a
.dc.b ' -F GVRAM強制使用',$d,$a
.dc.b ' -Q テキスト表示抑制(TVRAMを一切書き替えません)',$d,$a
.dc.b ' -H,-? このヘルプメッセージを表示します',$d,$a
.dc.b ' filenameにはワイルドカードが使用出来ます',$d,$a
.dc.b ' 数値指定部を 0x,$ で始めると16進表記が出来ます',$d,$a,0
NoFile_Txt: .dc.b 'コマンドラインにファイルネームが必要です',$d,$a,0
GVRAM_SYSTEM_USE_txt:
.dc.b 'GVRAMはシステムで使用中です',$d,$a,0
GVRAM_APRI_USE_txt:
.dc.b 'GVRAMはアプリケーションが使用中です',$d,$a,0
NoFFile_Txt:
.dc.b '指定ファイルがありません',$d,$a,0
Break_txt:
.dc.b '処理を中断します',$d,$a,0
PCD_NotFound_txt:
.dc.b '指定ファイルはPhotoCDフォーマットとして認識出来なかったか',$d,$a
.dc.b '未対応のフォーマットでした。',$d,$a,0
BrightErr_Txt: .dc.b '-Bの有効範囲は0~200です',$d,$a,0
LocateErr_txt:
.dc.b '-Lオプションの指定値が範囲外です',$d,$a,0
NotFile_txt:
.dc.b 'ファイルアクセスに失敗しました',$d,$a,0
MemoryErr_txt:
.dc.b '画像展開に必要なメモリが確保出来ませんでした',$d,$a,0
ESC_key_txt:
.dc.b 'ESCキーが押されました。',$d,$a,0
File_Break_txt:
.dc.b 'データが最後まで無いようです。',$d,$a,0
Playlist_NOread_txt:
.dc.b 'PLAYLIST.PCDの読み込みに失敗しました。',$d,$a,0
.align 4
Graph_Ptr: .dc.l $c00000
SW_LX: .dc.w 0
SW_LY: .dc.w 0
DEF_Y: .dc.w 100
IMAGE_NUM: .dc.w 2
SW_W: .dc.w 0
SW_A: .dc.b 0
SW_E: .dc.b 0
SW_F: .dc.b 0
SW_FN: .dc.b 0
SW_G: .dc.b 0
SW_H: .dc.b 0
SW_K: .dc.b 0
SW_N: .dc.b 0
SW_Q: .dc.b 0
SW_S: .dc.b 0
SW_BE: .dc.b 0
SW_PF: .dc.b 0
SW_P: .dc.b 0
FLG_V: .dc.b 0
FLG_EXT: .dc.b 0
FLG_WP: .dc.b 0
*------------------------------
* ブロックストレージセクション
*------------------------------
.bss
.align 4
DEC_WORK: .ds.w 8
ExecFN: .ds.l 1
CurLOC: .ds.l 1
FHdl: .ds.w 1
VCR2: .ds.w 1
FuncMODE: .ds.w 1
Target_File: .ds.b 128
V_FLAME: .ds.l 1
*------------------------------
* スタックセクション
*------------------------------
.stack
.ds.l 1000
StackBtm:
.end ProStart